package com.example.spring.ioc.example;

//import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import com.example.spring.ioc.example.model.Car;
import com.example.spring.ioc.example.model.Clazz;
//import com.example.spring.ioc.example.model.Person;
import com.example.spring.ioc.example.model.Teacher;

/**
 * 配置类 @Configuration 相当于 xml 中的 beans, @bean 相当于xml 中的 bean.<br/>
 * 配合各种注解的使用 @Configuration 可以替代 <beans> 配置中的所有功能.<br/>
 * 基本上 AnnotationConfigApplicationContext 和 @Configuration 组合使用就可以实现 Spring 容器纯
 * Java 启动.
 * 
 * @author jiang
 *
 */
@Configuration
@ComponentScan("com.example.spring.ioc.example.model")
public class BeanConfig {
	/**
	 * 带有@Component注解且通过@ComponentScan扫描，不需再定义 @Bean
	 * 
	 * @return
	 */
	// @Bean
	// public Student Student() {
	// return new Student();
	// }

	/**
	 * 通过 AnnotationConfigApplicationContext 直接向容器里注入 bean，不需再定义 @Bean
	 * 
	 * @return
	 */
//	@Bean
//	public Person pserson() {
//		return new Person();
//	}
	
	/**
	 * 实现了bean的嵌套注入
	 * 
	 * @return
	 */
	@Bean
	public Car car() {
		return new Car("大众", "红色");
	}

	/**
	 * 实现了bean的嵌套注入
	 * 
	 * @return
	 */
	@Bean
	public Teacher teacher() {
		Teacher teacher = new Teacher();
		teacher.setCar(car());// 直接采用引入bean定义方法名.
		return teacher;
	}

	@Bean
	public Clazz clazz() {
		Clazz clazz = new Clazz();
		clazz.setTeacher(teacher());// 直接采用引入bean定义方法名.
		return clazz;
	}
}
